#include <iostream>
#include <signal.h>
#include <unistd.h>

using namespace std;

void printAppend(sigset_t *aset)
{
  for (int i = 31; i >= 1; i--)
  {
    if (sigismember(aset, i))
    {
      cout << "1";
    }
    else
    {
      cout << "0";
    }
  }
  cout << endl;
}

void handler(int signo)
{
  cout << "get a sinal: " << signo << endl;
}

int main()
{
  signal(2, handler);
  // 先创建一个栈上的结构
  sigset_t bset, oset;
  // bset
  sigemptyset(&bset);
  sigaddset(&bset, 2);
  // oset
  sigemptyset(&oset);

  // 设置阻塞(屏蔽)
  sigprocmask(SIG_SETMASK, &bset, &oset);

  sigset_t aset;
  // 循环打印未决队列
  int cnt = 0;
  while (true)
  {
    sigpending(&aset);
    printAppend(&aset);
    sleep(1);
    cnt++;
    if (cnt == 20)
    {
      cout << "unblock 2 signal" << endl;
      sigprocmask(SIG_SETMASK, &oset, nullptr);
    }
  }

  return 0;
}